#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <omp.h>
#include <time.h>
#include<ctype.h>
#define MAX 100
#define num_blocos 11//lSize divisel por 7, 101, 7559

char arruma(char letra);
int palindromo(char string[]);


int main()
{
    FILE * pFile, *fp;
    long lSize;
    char * buffer[num_blocos];
    size_t result;
    int contador_frase = 0, contador_palavra = 0;
    int i = 0, j = 0, k = 0;
    clock_t inicio = 0, fim = 0;


    inicio = clock();
    pFile = fopen ( "shakespe.txt" , "r+" );
    if (pFile==NULL){
        fputs ("File error",stderr);
        exit (1);
    }

    fp = fopen("menor_omp.txt","w+");
// tamanho do arquivo
    fseek (pFile , 0 , SEEK_END);
    lSize = ftell (pFile);//lSize = 5344213
    int TAM = lSize/num_blocos;
    rewind (pFile);

    for(i = 0; i < num_blocos; i++){
        buffer[i] = (char*) malloc (sizeof(char)*TAM);
    }

// copia para o buffer
    for(i = 0; i < num_blocos; i++){
        result = fread (buffer[i],1,TAM,pFile);
        if (result != TAM){
            fputs ("Reading error",stderr);
            exit (3);
        }
    }

    char frase[100000], palavra[100000];
    int a = 0, contador_palavra_f = 0, contador_frase_f = 0;
    omp_set_num_threads(num_blocos);
 #pragma omp parallel for shared(buffer) firstprivate(palavra, frase) private(i, j, a,contador_palavra, contador_frase) reduction(+: contador_palavra_f, contador_frase_f)
 for(k = 0; k < num_blocos; k++){


    k = omp_get_thread_num();printf("k = %d\n",k);
    j = 0;
    i = 0;
    a = 0;
    contador_frase = 0;
    contador_palavra = 0;
//    printf("thread = %d\n", k);
//    printf("i = %d \n buffer = %d\n", i, strlen(buffer[k]));
//    getchar();
//    for(k = 0; k < num_blocos; k++){
        while(i < strlen(buffer[k])){
            while(buffer[k][i] != '\r'){
                if(isalpha(buffer[k][i])){
                    palavra[a] = buffer[k][i];
                    a++;
                }
                else{
                    palavra[a] = '\0';
                    a = 0;
                    if(palindromo(palavra) == 0 && strlen(palavra) > 1){
                        contador_palavra++;
                        //printf("%s\n",palavra);
                    }
                }
                frase[j] = buffer[k][i];
                j++;
                i++;
            }
            frase[j] = '\0';
            j = 0;
            if(palindromo(frase) == 0 && strlen(frase) > 2){
                //printf("%s\n",frase);
                contador_frase++;
            }
        i++;
        }
        i = 0;
    //printf("palavra = %d, frase = %d\n", contador_palavra, contador_frase);
    contador_palavra_f += contador_palavra;
    contador_frase_f += contador_frase;
    //end pragma
    }

    fprintf(fp,"\nTotal de frases palindromos: %d", contador_frase_f);
    fprintf(fp,"\nTotal de palavras palindromos: %d", contador_palavra_f);

    fclose (pFile);
    for(i = 0; i < num_blocos; i++){
        free (buffer[i]);
    }

    fim  = clock();
//tempo de execução
    double  tempo = (fim - inicio)/(CLOCKS_PER_SEC/1000);
    fprintf(fp,"\ntempo = %g\n", tempo);
    return 0;
}

int palindromo(char string[]){
    char strcomespaco[MAX],str1[MAX], str2[MAX];
    int tamcomespaco,tam, i, j;

    strcpy(strcomespaco,string);
    tamcomespaco = strlen(strcomespaco);

    for(i=0,j=0; i<tamcomespaco; i++){
        strcomespaco[i] = arruma(strcomespaco[i]);
        if(isalpha(strcomespaco[i])){
            str1[j] = strcomespaco[i];
            j++;
        }
    }
    str1[j]='\0';

    tam = strlen(str1);

    for (i=tam-1,j=0; i>=0; i--,j++){
        str2[j] = str1[i];
        if(str2[j] != str1[j])
            return 1;
    }

    str2[tam] = '\0';
    return 0;
}

char arruma(char letra){
    if(letra >= 65 && letra <= 90)
        letra = letra + 32;
        return letra;
}
